home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / zako031.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  4.0 KB  |  176 lines

  1. /* 3面で登場する破壊すると炸裂弾を発射するザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15. #define SPEED_1        8    /* 速度 */
  16. #define    SPEED_2        12    /* 2段階目の速度 */
  17.  
  18.  
  19. static short points_disp;    /* 得点を表示するか */
  20.  
  21. static short EnemyMoveZako031 (ENEMY *);
  22. static void EnemyTiniZako031 (ENEMY *);
  23.  
  24.  
  25. /* ゲーム開始時に1回だけ呼ばれる */
  26. void EnemyInitStaticZako031 (void)
  27. {
  28.     points_disp = 0;
  29. }
  30.  
  31.  
  32.  
  33. void EnemyInitZako031 (ENEMY * p)
  34. {
  35.     if (player->x < 144)
  36.         p->lx = 144 * 65536 + p->lx;
  37.     else
  38.         p->lx = 144 * 65536 - p->lx;
  39.     p->angle = psearch (SHORT_LX, SHORT_LY);
  40.     p->vx = vxtable[SPEED_1][p->angle];
  41.     p->vy = vytable[SPEED_1][p->angle];
  42.     p->pt = obj_zako02;
  43.     p->hit_px = 12;
  44.     p->hit_py = 12;
  45.     p->hit_sx = 12;
  46.     p->hit_sy = 12;
  47.     p->hit_cx = 8;
  48.     p->damage = p->damage_core = 0;
  49.     p->hp = 1;
  50.     p->seq = 0;
  51.     p->m_work = 0;
  52.     p->s_work = p->s_work2 = p->s_work3 = 0;
  53.     p->pt = obj_zako03 + 1;
  54.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  55.     p->core_pt = sp_core01;
  56.     p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  57.  
  58.     p->func_enemy_move = EnemyMoveZako031;
  59.     p->func_enemy_tini = EnemyTiniZako031;
  60. }
  61.  
  62.  
  63.  
  64. static short EnemyMoveZako031 (ENEMY * p)
  65. {
  66.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  67.     p->x = (p->lx += p->vx) >> 16;
  68.     p->y = (p->ly += p->vy) >> 16;
  69.  
  70.     switch (p->seq) {
  71.     case 0:
  72.         if (p->m_work++ > 30) {
  73.             p->seq++;
  74.         }
  75.         break;
  76.     case 1:
  77.         break;
  78.     }
  79.  
  80.     /* 攻撃開始 */
  81.     switch (p->s_work) {
  82.  
  83.     case 0:        /* 3-Way ショット */
  84. #define INTERVAL1_0        24
  85. #define SPEED_SHOT1_0    10
  86.         if (p->s_work2++ > INTERVAL1_0) {
  87.             p->s_work2 = 0;
  88.             switch (p->s_work3++) {
  89.                 /* case の順番に注意 */
  90.             case 1:
  91.                 /* ここに break がないことに注意 */
  92.             case 0:
  93.                 {
  94.                     char a = psearch (SHORT_LX, SHORT_LY);
  95.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_0, a - 8, 0);
  96.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_0 + 2, a, 0);
  97.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_0, a + 8, 0);
  98.                 }
  99.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  100.                 break;
  101.             case 2:
  102.             default:
  103.                 p->s_work++;
  104.                 p->s_work2 = p->s_work3 = 0;
  105.                 p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;    /* 赤くなる */
  106.                 break;
  107.             }
  108.         }
  109.         break;
  110.  
  111.     case 1:        /* 2-Way ショット */
  112. #define INTERVAL1_1        15
  113. #define SPEED_SHOT1_1    10
  114.         if (p->s_work2++ > INTERVAL1_1) {
  115.             p->s_work2 = 0;
  116.             if (p->s_work3++ < 2) {
  117.                 char a = psearch (SHORT_LX, SHORT_LY);
  118.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a - 8, 0);
  119.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a + 8, 0);
  120.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  121.             } else {
  122.                 p->seq++;
  123.                 p->vx = vxtable[SPEED_2][p->angle];
  124.                 p->vy = vytable[SPEED_2][p->angle];
  125.             }
  126.         }
  127.         break;
  128.     }
  129.  
  130.  
  131.     /* 画面外に出たら消去 */
  132.     /* (画面左右から出た判定と上下から出た判定を1回ずつの比較で行っている) */
  133.     if ((p->seq >= 1)
  134.         && (((unsigned short) p->x > 256 + 32) || ((unsigned short) p->y > 256 + 32)))
  135.         return (-1);    /* 消去 */
  136.  
  137.     /* 自機ショットに当たった時の処理 */
  138.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  139.     if (p->damage) {
  140.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  141.         SoundSetSE (SE_EXPL);
  142.         if (points_disp < ZAKO_SCORE_DISP) {
  143.             points_disp++;
  144.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  145.                 EffectInit (EFFECT_POINTS_RED, POINTS_500, p->x, p->y);
  146.             else
  147.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_200, p->x, p->y);
  148.         } else {
  149.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  150.                 EffectInit (EFFECT_POINTS, POINTS_500, p->x, p->y);
  151.             else
  152.                 EffectInit (EFFECT_POINTS, POINTS_200, p->x, p->y);
  153.         }
  154.         return (-1);    /* 消去 */
  155.     }
  156.     xobj_set_st (p);
  157.  
  158.     /* コアの表示 */
  159.     p->core_x = p->x - 8;
  160.     p->core_y = p->y - 8;
  161.     xsp_set_st (&(p->core_x));
  162.  
  163.     return (0);
  164. }
  165.  
  166.  
  167.  
  168. static void EnemyTiniZako031 (ENEMY * p)
  169. {
  170.     short h;
  171.     unsigned char a = 0;
  172. #define SPEED_SHOT2_3 12
  173.     for (h = 0; h < 16; h++)
  174.         EshotInit (ESHOT_NRG04, SHORT_LX, SHORT_LY, SPEED_SHOT2_3, a += 16, 0);
  175. }
  176.